home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 2
/
Gekikoh Dennoh Club Vol. 2 (Japan).7z
/
Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin
/
fsw
/
pd
/
wavemu.lzh
/
scc2
/
tail.s
< prev
next >
Wrap
Text File
|
1997-09-06
|
11KB
|
459 lines
* テーブル&非常駐部分
include doscall.mac
include iocscall.mac
include macro.h
* 外部から参照されるシンボル
.xdef wave_mem
.xdef pcm_buf,work_buf
.xdef fre_table
.xdef tail
.xdef user_SP
.xdef ERR_M2,ERR_M3,ERR_M4,ERR_M5,ERR_RI,ERR_NI,ERR_NF
.xdef ALSTALL,OVERFLOW,daSTEREO
.xdef fre_1
.xdef ins_mes,no_install
.xdef title,usage
.xdef read_switch,SW_SHITEI,SW_STEP,SW_NAME
.xdef 音色定義,常駐解除,REL
* コピーバック対策など
.xdef DMA_WINDOW_TOP,DMA_WINDOW,DMA_WINDOW_TALE,DMA_WINDOW_TALE2
* 参照するシンボル
.xref MEM_POS,BACK_V2,SHT_TITLE
A_dma_ch2 equ $e84080
A_pcm_data equ $ecc080
A_pcm_command equ $ecc091
A_pcm_status equ $ecc0a1
wait_LRCK macro
movea.l #A_dma_ch2,a0
@@: btst.b #0,(a0) * dmac ch2 PCL
beq @b
@@: btst.b #0,(a0)
bne @b
endm
.data
.bss
.quad
work_buf: ds.w 1024*2
wave_mem: ds.b 64*16*64
*****
.align 16 * 境界をそろえる
DMA_WINDOW_TOP::
ds.b 8192
DMA_WINDOW::
pcm_buf: ds.w 1024*2
DMA_WINDOW_TALE:
ds.b 8192
DMA_WINDOW_TALE2:
*****
fre_table: ds.w 16384*2
tail:
.quad
ds.b 32000
user_SP:
.text
.quad
read_switch:
push d0-d3/a0-a3
LEA SW_YUUKOU,A0
LEA 1(A2),A1 * 文字数のスキップ
LEA 130(A0),A2 * ファイル名の指定場所
MOVEQ #0,D3 * ファイル名のフラグ
* Phase-1 何があるかを調べている
SWITJP1:
SWITLP1: MOVE.B (A1)+,D0 * 文字の読み込み
BEQ SWEND
CMP.B #' '+1,D0 * SPACE/TAB/CTRL はパスさせる
BCS SWITLP1
CMP.B #'-',D0 * スイッチ識別子にヒット
BEQ SWITJP2
CMP.B #'/',D0 * スイッチ識別子にヒット
BEQ SWITJP2
CMP.B #'>',D0 * リダイレクトにヒット
BEQ SWEND
CMP.B #'<',D0 * リダイレクトにヒット
BEQ SWEND
CMP.B #$22,D0 * " Phase 7
BEQ SWITJP7
BRA SWITJP3 * ファイル名だった
* Phase-2 スイッチの読み込み
SWITJP2: MOVE.B (A1)+,D0
CMP.B #'A',D0
BCS SWITER1 * スイッチが適当でない
CMP.B #'Z'+1,D0
BCS SWT2J1 * 大文字のスイッチが見つかった
CMP.B #'a',D0
BCS SWITER1 * スイッチが適当でない
CMP.B #'z'+1,D0
BCC SWITER1 * スイッチが適当でない
SUB.B #'a'-'A',D0 * 大文字を個文字に直す
SWT2J1: SUB.B #'A',D0 * スイッチの有効性を調べる
AND.W #$FF,D0
TST.B (A0,D0.w)
BEQ SWITER2 * 無効なスイッチが指定された
MOVE.B #1,52(A0,D0.w) * スイッチの指定フラグを立てる
MOVE.B 26(A0,D0.w),D1 * 後続を調べる
BEQ SWITJP4 * 後続は何もなし
CMP.B #1,D1
BEQ SWITJP5 * 後続は数字
CMP.B #2,D1
BEQ SWITJP6 * 後続は文字列
BRA SWITER3 * ワークエリアの内容がおかしい
* Phase-3 ファイル名の読み込み
SWITJP3: CMP.W #1,D3
BEQ SWITER4 * ファイル名が規定数よりも多く設定された
INC.W D3 * ファイル名のカウント
LEA (A2),A3
MOVE.B D0,(A3)+ * チェックのために読み込んだ文字を書き込む
SWT3J2: MOVE.B (A1)+,D0 * 読み込み
CMP.B #' '+1,D0
BCS SWT3J1 * 読み込みの終了
CMP.B #'-',D0 * Switch exit
BEQ SWT3J1
CMP.B #'/',D0
BEQ SWT3J1
CMP.B #'>',D0
BEQ SWT3J1
CMP.B #'<',D0
BEQ SWT3J1
CMP.B #$22,D0 * "
BEQ SWT3J1
MOVE.B D0,(A3)+ * 書き込み
BRA SWT3J2
SWT3J1: DEC.L A1 * 一文字分もとに戻します
CLR.B (A3) * ファイル名の終に0を付ける
LEA 128(A2),A2 * ワークエリアを進める
BRA SWITJP1 * もとに返る
* Phase-4 スイッチの後続は何もなかった
SWITJP4: BRA SWITJP1 * もとに返る
* Phase-5 スイッチの後続は数字である
SWITJP5: MOVE.B (A1),D1
CMP.B #' '+1,D1
BCS SWITJP1 * 何もなかった
CMP.B #'/',D1
BEQ SWITJP1 * 何もなかった
CMP.B #'-',D1
BEQ SWITJP1 * 何もなかった
CMP.B #'>',D1
BEQ SWITJP1 * 何もなかった
CMP.B #'<',D1
BEQ SWITJP1 * 何もなかった
CMP.B #$22,D1 * "
BEQ SWITJP1
CMP.B #'$',D1
BEQ SWT5J1 * 16進数である
CMP.B #'0',D1
BCS SWITJP1 * 何もなかった
* BCS SWITER5 * スイッチの後続が異常
CMP.B #'9'+1,D1
BCC SWITJP1 * 何もなかった
* BCC SWITER5 * スイッチの後続が異常
AND.W #$FF,D0
ADD.B D0,D0
LEA 78(A0,D0.w),A3 * 書き込み先
MOVEQ #0,D1
MOVEQ #0,D0
SWT5J2: MOVE.B (A1)+,D0 * 数字の読み込み
SUB.B #'0',D0
BCS SWT5J3 * 読み込み終了
CMP.B #10,D0
BCC SWT5J3 * 読み込み終了
ADD.W D1,D1 * D1=oldd1*2
MOVE.W D1,D2 * D2=oldd1*2
ADD.W D2,D2 * D2=oldd1*4
ADD.W D2,D2 * D2=oldd1*8
ADD.W D0,D1 * D1=oldD1*10+D0
ADD.W D2,D1
BRA SWT5J2
SWT5J3: MOVE.W D1,(A3) * 読み込み終了/書き込み
DEC.L A1 * 一文字分もとに戻す
BRA SWITJP1
SWT5J1: AND.W #$FF,D0 * 16進数の読み込み
ADD.B D0,D0
LEA 78(A0,D0.w),A3 * 書き込み先
INC.L A1 * $をスキップ
MOVEQ #0,D1
MOVEQ #0,D0
SWT5J4: MOVE.B (A1)+,D0 * テキストより読み込み
CMP.B #'0',D0
BCS SWT5J3 * 読み込み終了
CMP.B #'9'+1,D0
BCS SWT5J5 * 0~9を読み込んだ
CMP.B #'A',D0
BCS SWT5J3 * 読み込み終了
CMP.B #'F'+1,D0
BCS SWT5J6 * A~Fを読み込んだ
CMP.B #'a',D0
BCS SWT5J3 * 読み込み終了
CMP.B #'f'+1,D0
BCC SWT5J3 * 読み込み終了
SUB.B #'a'-10,D0 * a~fを読み込んだ
BRA SWT5J7
SWT5J6: SUB.B #'A'-10,D0 * A~Fを読み込んだ
BRA SWT5J7
SWT5J5: SUB.B #'0',D0 * 0~9を読み込んだ
SWT5J7: ROL.W #4,D1 * D1=D1*16+D0
OR.B D0,D1
BRA SWT5J4
* Phase-6 スイッチの後続の文字列の読み込み
SWITJP6: ADD.B #'A',D0 * スイッチをアスキーコードに直す
LEA 194+64(A0),A3
SWT6J1: MOVE.B (A3),D1 * 格納先を求める
BEQ SWITER3 * ワークエリアの内容がおかしい
CMP.B D1,D0
BEQ SWT6J2 * 格納先が見つかった
LEA 128(A3),A3
BRA SWT6J1
SWT6J2: INC.L A3
SWT6J3: MOVE.B (A1)+,D0 * 一文字読み込み
CMP.B #'-',D0 * Switch exit
BEQ SWT6J4
CMP.B #'/',D0
BEQ SWT6J4
CMP.B #'>',D0
BEQ SWT6J4
CMP.B #'<',D0
BEQ SWT6J4
CMP.B #$22,D0 * "
BEQ SWT6J4
CMP.B #' '+1,D0
BCS SWT6J4 * 読み込み終了
MOVE.B D0,(A3)+
BRA SWT6J3
SWT6J4: DEC.L A1 * 一文字戻す
CLR.B (A3) * 最後に0を書き込む
BRA SWITJP1
* Phase-7 まとめしてい
SWITJP7: CLR.W D0
CLR.W D5
SWT7L1: MOVE.B (A1)+,D0
BEQ.w SWT7J4 * exit2
CMP.B #$22,D0
BEQ.w SWT7J1 * exit
CMP.B #'0',D0
BCS SWITER5 * スイッチの後続が異常である
CMP.B #'9'+1,D0
BCS SWT7J3 * スイッチの後続の数字
CMP.B #'A',D0
BCS SWITER5 * スイッチの後続が異常である
CMP.B #'Z'+1,D0
BCS SWT7J2 * Nomal
SUB.B #'a'-'A',D0
CMP.B #'A',D0
BCS SWITER5 * スイッチの後続が異常である
CMP.B #'Z'+1,D0
BCC SWITER5 * スイッチの後続が異常である
SWT7J2: SUB.B #'A',D0 * スイッチの有効性を調べる
TST.B (A0,D0.w)
BEQ SWITER2 * 無効なスイッチが指定された
MOVE.W D0,D1
ADD.W D1,D1 * SW_STEP
CLR.W D2
MOVE.B 26(A0,D0.w),D5 * KOUZOKU
MOVE.B #1,52(A0,D0.w) * スイッチの指定フラグを立てる
BRA SWT7L1
SWT7J1: BRA SWITJP1
SWT7J4: DEC.W A1
BRA SWITJP1
SWT7J3: CMP.B #1,D5
BNE SWITER5 * スイッチの後続が異常である
ADD.W D2,D2
MOVE.W D2,D4
ADD.W D2,D2
ADD.W D2,D2
ADD.W D4,D2
SUB.W #'0',D0
ADD.W D0,D2
MOVE.W D2,78(A0,D1.w)
BRA SWT7L1
* 読み込み終了
SWEND: pop d0-d3/a0-a3
MOVEQ #0,D0
RTS
* エラー終了
SWITER1: * スイッチが不適当だった
PRINT title
PRINT usage * 使い方の説明
BRA SWR_ER
SWITER2: * 無効なスイッチを指定した
PRINT ERR_M2
BRA SWR_ER
SWITER3: * ワークエリアの内容がおかしい
PRINT ERR_M3
BRA SWR_ER
SWITER4: * スイッチが規定数より多く設定された
PRINT ERR_M4
BRA SWR_ER
SWITER5: * スイッチの後続が異常である
PRINT ERR_M5
BRA SWR_ER
SWR_ER: pop d0-d3/a0-a3
DC.W __EXIT
常駐解除:
JSR REL * 常駐解除する
BNE INSTER
* コピーバック対策の解除
MOVE.L (A1)+,37*4.w * ベクタを戻す
*MOVE.L (A1)+,37*4-4.w * ベクタを戻す
MOVE.L (A1)+,d0 * ベクタを戻す
move.l (a1)+,($1a8)
move.l (a1)+,($1ac)
push d0-a0/a2-a6
move.w SR,-(SP)
ori.w #$0700,SR *割り込み禁止
movea.l (a1)+,A0
move.l A0,(($0100+_SYS_STAT)*4).w
tst.b $0CBC.w
beq @f *68030未満
*********************************************************
suba.l A5,A5
moveq.l #$03,D1
jsr (A0) *キャッシュクリア
* (注) 命令キャッシュが更新されていない可能性があるので
* この場合IOCSは使用できない。
@@:
move.w (SP)+,SR *割り込み許可
pop d0-a0/a2-a6
* Mach2対策
cmpi.w #$4368,$00ed0098 * MACH2が入っているか?
bne @f * 入っていなかったら
move.b #$31,$00e8e00d * 許可
move.b (a1)+,($ED009B)
move.b #$00,$00e8e00d * 禁止
@@:
* ここまで
PEA $10(A0) * メモリブロックの解放
DC.W __MFREE
ADDQ.W #4,SP
PRINT ERR_RI * 常駐解除できた
wait_LRCK
move.b #%0001_0000,7(a0) * DMAC stop
nop
nop
tst.b ($e9a001)
nop
DC.W __EXIT
INSTER: PRINT ERR_NI * 常駐解除できなかった
DC.W __EXIT
* 常駐チェック
REL: MOVE.L MEM_POS,A0
LEA -$10(A0),A0
RELLPa: MOVE.L (A0),A0
CMPA.L #0,A0
BEQ RELERR
LEA $100(A0),A1
LEA SHT_TITLE,A2
MOVE.W #BACK_V2-SHT_TITLE,D0
MOVEQ #0,D7 * 問題:なぜこれがいるのでしょう?
BRA RELJPa * 答え:いきなりループを抜けるため。
RELLPb: CMP.B (A1)+,(A2)+
RELJPa: DBNE D0,RELLPb
BNE RELLPa
MOVEQ #0,D0 * 常駐解除可能だった
RTS
RELERR: MOVEQ #1,D0 * 常駐解除できなかった
RTS
音色定義:
moveq #0,d7
moveq #0,d1
@@:
push d7
lea PSG,a0
moveq #4,d0 * 音色定義の番号
move.w d7,d1
trap #5
pop d7
addq.w #1,d7
cmp.w #8,d7
bcs @b
rts
.data
.quad
* 0 1 2 3 4 5 6 7 8 9 11 2 3 4 5 6 7 8 9 21 2 3 4 5
* A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
SW_YUUKOU: dc.b 0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0 *スイッチ無/有効
dc.b 0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0 *後に無/数字/文字
SW_SHITEI: dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 *スイッチ指定flag
SW_STEP: dc.w 0,64,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 *初期値
SW_NAME: ds.b 128 * FILENAME
.data
.quad
ERR_M2: DC.B '無効なスイッチを指定しました。',$D,$A,0
ERR_M3: DC.B 'ワークエリアの内容がおかしいです。',$D,$A,0
ERR_M4: DC.B 'スイッチが規定数より多く設定されました。',$D,$A,0
ERR_M5: DC.B 'スイッチの後続が異常です。',$D,$A,0
ERR_RI: DC.B 'wavemu.xを常駐解除しました。',$D,$A,0
ERR_NI: DC.B 'wavemu.xは常駐していません。',$D,$A,0
ERR_NF: DC.B 'ファイル名の指定がされていません。',$D,$A,0
ALSTALL: DC.B 'すでに常駐しています。',$D,$A,0
OVERFLOW: dc.b 'スイッチの引数が適切ではありません。',$d,$a,0
fre_1: dc.b '15.6KHz mode ',0
ins_mes: dc.b 'にて常駐します',$d,$a,0
daSTEREO: dc.b $d,'!そのスイッチは無意味だよーん^^;',$d,$a,00
.even
.data
no_install: dc.b 'Mercury Unitが装着されていません。',$d,$a,0
title: dc.b '波形メモリ音源シミュレータ 内蔵音源版 (C)1997/9/6 Otankonas',$d,$a,0
usage: dc.b 'wavemu.x [switch1] [switch2] ...',$d,$a
dc.b ' -Cn ポリフォニックする数 default:5ch',$d,$a
dc.b ' -Bn 連続転送するバッファの大きさ default:64words',$d,$a
dc.b ' -R 常駐解除する',$d,$a
dc.b 0
.quad
PSG: dc.b -127,-127,-127,-127,-127,-127,-127,-127
dc.b -127,-127,-127,-127,-127,-127,-127,-127
dc.b 127,127,127,127,127,127,127,127
dc.b 127,127,127,127,127,127,127,127
.quad
.bss
end
音源 : 波形メモリ方式
定義できる音色数 : 0-63
ボリュームの値 : 0-15
チャンネル数 : 可変(1-8)
周波数 : 可変
保証周波数 : 再生周波数/16未満。波形次第で上げることも可^^;